/*
 ============================================================================
 * Archivo:   VentanaMenuCliente.cpp
 * Autor:     Martin Lucero
 ============================================================================
 */

#include "VentanaMenuCliente.h"

// Borra esto cuando no uses mas los std::cout
#include <iostream>
#include <vector>
#include <glibmm-2.4/glibmm/signalproxy.h>
#include <cstdlib>

#define		FPS_DEFAULT             30
//#define		RUTA_ICONO_VENTANA      "../Recursos/diseñador_icono.png"

#define		PATH_FONDO              "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/fondo.png"

#define		PATH_PAJARITO_ROJO      "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/pajaro_rojo_icono.png"
#define		PATH_PAJARITO_AZUL      "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/pajaro_azul_icono.png"
#define		PATH_PAJARITO_VERDE     "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/pajaro_verde_icono.png"

#define		PATH_CERDITO            "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/cerdito_icono.png"

#define     PATH_HUEVO_RELOJ        "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/huevo_reloj.png"
#define     PATH_HUEVO_POCHE        "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/huevo_poche.png"
#define     PATH_HUEVO_CODORNIZ     "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/huevo_codorniz.png"
#define     PATH_HUEVO_BLANCO       "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/huevo_blanco.png"

#define     PATH_CATAPULTA          "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/catapulta_icono.png"

#define     PATH_CAJA_MADERA        "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/caja_madera_icono.png"
#define     PATH_CAJA_METAL         "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/caja_metal_icono.png"
#define     PATH_CAJA_VIDRIO        "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/caja_vidrio_icono.png"

#define     PATH_MANZANA            "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/manzana_icono.png"
#define     PATH_BANANA             "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/banana_icono.png"
#define     PATH_CEREZA             "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/cereza_icono.png"

#define     PATH_MONTICULO_HUEVOS   "/home/nahuel/75.42 TP5/branch/cliente-grafico/Fuentes/Recursos/huevos_icono.png"


using namespace std;

VentanaMenuCliente::VentanaMenuCliente(Cliente* cliente) : cliente(cliente) {
	set_title("Cerditos Furiosos - Menu");
	set_position(Gtk::WIN_POS_CENTER);

	selector_mundos.signal_changed().connect(sigc::mem_fun(*this, &VentanaMenuCliente::on_combo_mundos_changed));
	empezarPartidaButton.signal_clicked().connect(sigc::mem_fun(*this, &VentanaMenuCliente::on_empezar_partida_clicked));
	selector_mundos.set_focus_on_click(false);

	Gtk::Label *etiqueta;

	etiqueta = Gtk::manage(new Gtk::Label("MENU PRINCIPAL", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 0, 2, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Escoge un Mundo:", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 1, 1, 1);
	grilla.attach_next_to(selector_mundos, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Escoge un Nivel:", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 2, 1, 1);
	grilla.attach_next_to(selector_niveles, *etiqueta, Gtk::POS_RIGHT, 1, 1);
	
	etiqueta = Gtk::manage(new Gtk::Label("Nombre de tu partida:", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 3, 1, 1);
	grilla.attach_next_to(nombrePartida, *etiqueta, Gtk::POS_RIGHT, 1, 1);
	
	empezarPartidaButton.set_label("Crear partida");
	grilla.attach(empezarPartidaButton, 0, 5, 2, 1);	

	grilla.set_column_spacing(5);
	grilla.set_row_spacing(10);
	
	add(grilla);
	
	// Le pedimos los mundos al cliente y los cargamos en el combo box
	vector<string> vectorMundos = cliente->listarMundos();
	cargarMundosAlComboBox(vectorMundos);
	
	// Carga los niveles
	on_combo_mundos_changed();
	
	/* Esto es una ventana basica. Vos desp le agregas algun boton para cargar el
	 * juego y abrir una nueva ventana, o lo que necesites. Todos los widgets que
	 * agregues, metelos como atributos privados de esta clase (y te recomiendo
	 * que no sean punteros con memoria dinamica, y en caso de serlos, desp borralos
	 * en el destructor. otra forma es con Gtk::Manage, pero si no la usaste, no
	 * pierdas tiempo entendiendola..) Todos los widgets tenes que agregarlos al
	 * gtk::Grid grilla que hice, con el metodo "attach". Mira los parametros que
	 * utiliza y lo entendes de toque */

	set_border_width(10);
	show_all_children();
}

VentanaMenuCliente::~VentanaMenuCliente() {
	// TODO
}

/* Este metodo agrega los nombres de los mundos. Primero se deberian obtener
 * de la lista de mundos que recibis del servidor. */
void VentanaMenuCliente::cargarMundosAlComboBox(std::vector<std::string>& vectorMundos) {
		
	selector_mundos.remove_all();
	std::vector<std::string>::iterator it;
	
	for(it = vectorMundos.begin(); it != vectorMundos.end(); ++it) {
		//DEBUG
		std::cout << vectorMundos.size() << std::endl;
		std::cout << (*it);
		
		selector_mundos.append(*it);	
	}
}

void VentanaMenuCliente::cargarNivelesAlComboBox(std::vector<std::string>& vectorMundos) {
	/* ALGO ASI: (std::vector<Nivel*> lista_niveles es un atributo miembro privado)
	 * ACLARACION: Ver si getListadoNiveles te devuelve una copia del vector, un puntero, o una referencia, para saber si hay que eliminar memoria o no. Y averiguar si el operador "=" entre vectores hace copias de vectores!!
	 *
	 * lista_niveles = lista_mundos.find(nombreMundo).getListaNiveles(); // O SEA, ACA TENES QUE BUSCAR EN LA LISTA MUNDOS EL MUNDO DE DICHO NOMBRE Y SACARLE SU LISTA DE NIVELES. FIJARSE EN "vector" METODOS DE BUSQUEDA
	 * 
	 * selector_niveles.remove_all();
	 * for(unsigned i = 0; i < lista_niveles.size(); ++i) {
	 *		selector_niveles.append(lista_niveles[i].getNombre());
	 * }
	 */
	selector_niveles.remove_all();
	std::vector<std::string>::iterator it = vectorMundos.begin();
	
	for(; it != vectorMundos.end(); ++it) {
		selector_niveles.append(*it);
	}
	
	// ESTO ES PARA PROBAR...
//	selector_niveles.remove_all();
//	selector_niveles.append(Glib::ustring(nombreMundo + ": Nivel 1"));
//	selector_niveles.append(Glib::ustring(nombreMundo + ": Nivel 2"));
//	selector_niveles.append(Glib::ustring(nombreMundo + ": Nivel 3"));
}

/* Handler de cuando se elige una nueva entrada en el combo box del mundo. Aca tendrias
 * que llamar a "cargarNivelesAlComboBox" ogido, y hacer los append como
 * se hizo aca, pero en el combo box de niveles */
void VentanaMenuCliente::on_combo_mundos_changed() {
	string mundoSeleccionado = selector_mundos.get_active_text();
	vector<string> nivelesMundoSeleccionado = 
			cliente->listarNiveles(mundoSeleccionado);
	
	// Cargamos los niveles al ComboBoxText
	cargarNivelesAlComboBox(nivelesMundoSeleccionado);	
}

void VentanaMenuCliente::on_empezar_partida_clicked() {
	string mundo = selector_mundos.get_active_text();
	string nivel = selector_niveles.get_active_text();
	
	
	
	// Creamos la ventana de juego
	ventanaJuego = new VentanaJuego(cliente, FPS_DEFAULT);
    
	ventanaJuego->SetImagenFondo(PATH_FONDO);
	ventanaJuego->SetImagenCerdito(PATH_CERDITO);
	ventanaJuego->SetImagenPajaroRojo(PATH_PAJARITO_ROJO);
	ventanaJuego->SetImagenPajaroAzul(PATH_PAJARITO_AZUL);
	ventanaJuego->SetImagenPajaroVerde(PATH_PAJARITO_VERDE);
    ventanaJuego->SetImagenHuevoBlanco(PATH_HUEVO_BLANCO);
    ventanaJuego->SetImagenHuevoPoche(PATH_HUEVO_POCHE);
    ventanaJuego->SetImagenHuevoReloj(PATH_HUEVO_RELOJ);
    ventanaJuego->SetImagenHuevoCodorniz(PATH_HUEVO_CODORNIZ);
    ventanaJuego->SetImagenCajaMadera(PATH_CAJA_MADERA);
    ventanaJuego->SetImagenCajaVidrio(PATH_CAJA_VIDRIO);
    ventanaJuego->SetImagenCajaMetal(PATH_CAJA_METAL);
    ventanaJuego->SetImagenCatapulta(PATH_CATAPULTA);
    ventanaJuego->SetImagenMonticuloHuevos(PATH_MONTICULO_HUEVOS);
    ventanaJuego->SetImagenManzana(PATH_MANZANA);
    ventanaJuego->SetImagenBanana(PATH_BANANA);
    ventanaJuego->SetImagenCereza(PATH_CEREZA);    
	
	Partida* nuevaPartida;
	
	// Creamos la partida en el servidor
	try {
		nuevaPartida = cliente->crearPartida(mundo, atoi(nivel.c_str()), nombrePartida.get_text());
		
		threadMotorJuego = new ThreadMotorJuego(cliente, ventanaJuego);	
		// TEST!!!!
		Gtk::Window* dummy = new Gtk::Window;
		dummy->add(*ventanaJuego);

		this->hide();	
		dummy->show_all();

		threadMotorJuego->Iniciar();
	} catch(Excepcion& pEx) {
		// TODO: Mostrar error por pantalla
		std::cout << pEx.what() << std::endl;
		
//		throw; // Borrar
	}	
}